#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "resource.h"
#include "game.h"

/**
 * Destruktor
 */
Resource::~Resource()
{
	// zamknij plik
	Game::getResourceManager()->getResourceList().remove(this);
	unload();
	closeFile();
}

/**
 * Laduje dane zasobu z pliku
 */
bool Resource::openFile(const std::string &fileName)
{
	// jest juz jakis plik otwarty?
	if(data)
		closeFile();
	
	// otworz plik
	hFile = (void*)CreateFile(fileName.c_str(), GENERIC_READ,
		FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if(INVALID_HANDLE_VALUE == (HANDLE)hFile)
		return false;

	// pobierz rozmiar pliku
	dataSize = GetFileSize((HANDLE)hFile, NULL);

	// stworz mapowanie pliku do pamieci
	hMapping = (void*)CreateFileMapping((HANDLE)hFile, NULL, PAGE_READONLY,
		0, 0, NULL);
	if(!hMapping)
		return false;
	
	// otworz mapowanie
	data = MapViewOfFile((HANDLE)hMapping, FILE_MAP_READ, 0, 0, 0);

	// koniec
	return (data != NULL);
}

/**
 * Zamyka plik zasobu.
 */
void Resource::closeFile()
{
	// brak otwartego pliku - koniec
	if(!data)
		return;

	// zamknij mapowanie pliku
	UnmapViewOfFile(data);
	CloseHandle((HANDLE)hMapping);
	CloseHandle((HANDLE)hFile);
	data = NULL;
	dataSize = 0;
	hFile = NULL;
	hMapping = NULL;
}
